package LimitedTimeGame.Day_0212;

/**
 * @author zxc
 * @date 2023/02/12 18:52
 **/

import java.util.HashMap;

/**
 * 题目 ：字母板上的路径
 * 题目详述 ：
 * 我们从一块字母板上的位置(0, 0)出发，该坐标对应的字符为board[0][0]。
 * 在本题里，字母板为board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]，如下所示。
 * 我们可以按下面的指令规则行动：
 * 如果方格存在，'U'意味着将我们的位置上移一行；
 * 如果方格存在，'D'意味着将我们的位置下移一行；
 * 如果方格存在，'L'意味着将我们的位置左移一列；
 * 如果方格存在，'R'意味着将我们的位置右移一列；
 * '!'会把在我们当前位置 (r, c) 的字符board[r][c]添加到答案中。
 * （注意，字母板上只存在有字母的位置。
 * 返回指令序列，用最小的行动次数让答案和目标target相同。你可以返回任何达成目标的路径
 *
 * 提示：
 * 1 <= target.length <= 100
 * target 仅含有小写英文字母。
 *
 */
public class AlphabetBoardPath {
    public static void main(String[] args) {
        System.out.println(alphabetBoardPath("leet"));
    }
    /**
     * 思路 ：
     * ===》
     * （1）使用哈希表，来存储各个小写字母在数组中位置;
     *  ===》 哈希表结构是key == 小写字母 - 'a'（Integer类型），同时 value == int[]（用来记录当前字母所对应在数组中下标;）
     * （2）即，从(0,0)进行遍历，获取字符串target中第一个字母在数组中位置，判断其距离自身的最少行动次数;
     * （3）每进行一次移动后，就选择获取target字符串中后一个字母在数组中的位置，计算当前位置移动到其 所需要的最少行动次数;
     * ===> 需要注意特殊情况 ：即，若是开始移动的字母为'z'/要移动至的字母为'z'的话，则需要进行进一步地考虑;
     * a.若是开始移动的字母为'z'的话，则代表了当前字母'z'是不能够向右移动的;
     * b.若是要移动至的字母为'z'的话，则代表了当前字母需要先横向移动，然后再次纵向移动;
     *
     * @param target
     * @return
     */
    public static String alphabetBoardPath(String target) {
        HashMap<Integer , int[]> hashMap = new HashMap<>();
        for(int i = 0 ; i < 26 ; i++){
            hashMap.put( i  , new int[]{i / 5,i % 5});
        }
        int[] first = new int[]{0 , 0};
        StringBuilder result = new StringBuilder("");
        for(int i = 0 ; i < target.length(); i++){
            Integer key = target.charAt(i) - 'a';
            int[] coordinate = hashMap.get(key);
//            System.out.println("first : " + first[0] + "," + first[1]);
//            System.out.println("coordinate : " + coordinate[0] + "," + coordinate[1]);
            // 即，特殊情况 ：当前遍历目标字符串target中字符为'z'时;
            if(first[0] == 5){
                for(int k = 0 ; k < Math.abs(coordinate[0] - first[0]); k++){
                    result.append(coordinate[0] - first[0] >= 0 ? 'D' : 'U');
                }
                for(int j = 0 ; j < Math.abs(coordinate[1] - first[1]); j++){
                    result.append(coordinate[1] - first[1] >= 0 ? 'R' : 'L');
                }
            }
            else {
                for(int j = 0 ; j < Math.abs(coordinate[1] - first[1]); j++){
                    result.append(coordinate[1] - first[1] >= 0 ? 'R' : 'L');
                }
                for(int k = 0 ; k < Math.abs(coordinate[0] - first[0]); k++){
                    result.append(coordinate[0] - first[0] >= 0 ? 'D' : 'U');
                }
            }
            result.append('!');
            first = coordinate;
        }
        return result.toString();
    }
}
